/**
 * D5Power Studio FPower 2D MMORPG Engine
 * 第五动力FPower 2D 多人在线角色扮演类网页游戏引擎
 * 
 * copyright [c] 2010 by D5Power.com Allrights Reserved.
 */ 
package com.D5Power.Objects
{
	import com.D5Power.GMath.data.qTree.QTree;
	import com.D5Power.Objects.Effects.Shadow;
	import com.D5Power.Render.Render;
	import com.D5Power.basic.GraphicsResource;
	import com.D5Power.map.WorldMap;
	import com.D5Power.utils.XYArray;
	
	import flash.display.BitmapData;
	import flash.geom.Point;
	import flash.geom.Rectangle;

	/**
	 * 游戏对象基类
	 * 游戏中全部对象的根类
	 */ 
	public class GameObject
	{
		/**
		 * 区块坐标X
		 */ 
		public var _tileX:uint;
		/**
		 * 区块坐标Y
		 */ 
		public var _tileY:uint;
		
		/**
		 * 渲染器
		 */ 
		public var render:Render;
		
		/**
		 * 是否可用
		 */ 
		public var inuse:Boolean=true;
		
		/**
		 * 外部引用数
		 */ 
		public var linkNum:int = 0;
		
		/**
		 * 是否可被攻击
		 */ 
		public var canBeAtk:Boolean=false;
		
		/**
		 *	是否摄像机跟随的目标 
		 */
		public var beFllow:Boolean=false;
		
		public var ID:uint=0;
		
		/**
		 * 类型名，用于点击区分
		 */ 
		public var objectName:String='GameObject';
		
		/**
		 * 渲染坐标
		 */ 
		public var renderPoint:Point=new Point();
		
		/**
		 * 上一次的渲染坐标，用来进行脏矩形擦除
		 */ 
		public var lastRenderPoint:Point=new Point();
		
		/**
		 * 深度排序
		 */ 
		protected var zorder:int = 0;
		
		/**
		 * 对象定位
		 */ 
		protected var pos:Point;
		
		/**
		 * 对象的速度
		 */
		protected var _speed:Number=2;
		
		/**
		 * 图形资源
		 */ 
		protected var _graphics:GraphicsResource;
		
		/**
		 * 行动方向  默认为8个方向 配置见Directions对象
		 */			
		protected var _directionNum:int=0;
		
		/**
		 * 排序调整
		 */ 
		protected var _zOrderF:int=0;
		
		/**
		 * 显示阴影
		 */ 
		protected var _shadow:Shadow;
		
		/**
		 * 记录当前对象所在的象限
		 */ 
		protected var _qTree:QTree;
		
		/**
		 * 角色阵营
		 */ 
		protected var _camp:uint=0;
		
		/**
		 * 渲染方式
		 */ 
		protected var _renderPos:uint;
		
		public static const BOTTOM:uint = 1;
		public static const LEFTTOP:uint = 0;
		public static const CENTER:uint = 2;
	

		public function GameObject()
		{
			pos = new Point(0,0);
			_renderPos = LEFTTOP;
		}
		
		/**
		 * 设置对象的坐标定位
		 * @param	p
		 */ 
		public function setPos(px:uint,py:uint):void
		{
			pos.x = px;
			pos.y = py;
			zorder = pos.y;
			if(beFllow) WorldMap.needUpdate=true;
		}
		
		/**
		 * 当前对象所在的象限
		 */ 
		public function set qTree(q:QTree):void
		{
			_qTree = q;
		}
		
		/**
		 * 获取对象的坐标定位
		 */ 
		public function get Pos():Point
		{
			return pos;
		}
		
		/**
		 * 影子
		 */ 
		public function get shadow():Shadow
		{
			return _shadow;
		}
		
		/**
		 * 深度排序浮动
		 */ 
		public function set zOrderF(val:int):void
		{
			_zOrderF = val;
		}
		/**
		 * 深度排序浮动
		 */
		public function get zOrderF():int
		{
			return _zOrderF;
		}
		
		/**
		 * 获取坐标的深度排序
		 */ 
		public function get zOrder():int
		{
			//return zorder;
			return pos.y+_zOrderF;
		}
		
		public function set speed(value:Number):void
		{
			_speed = value;
		}
		
		public function get speed():Number
		{
			return _speed;
		}
		
		/**
		 * 面向角度
		 */ 
		public function get Angle():uint
		{
			switch(_directionNum)
			{
				case Directions.Up:
					return 0;
					break;
				case Directions.LeftUp:
					return 315;
					break;
				case Directions.Left:
					return 270;
					break;
				case Directions.LeftDown:
					return 215;
					break;
				case Directions.Down:
					return 180;
					break;
				case Directions.RightDown:
					return 135;
					break;
				case Directions.Right:
					return 90;
					break;
				case Directions.RightUp:
					return 45;
					break;
				default:
					return 0;
					break;
			}
		}
		
		/**
		 * 渲染自己在屏幕上输出
		 */
		public function renderMe():void
		{
			if(render!=null && renderPoint.x*renderPoint.y>0 && inuse)
			{
				render.render(this);
			}
		}
		
		/**
		 * 将自己从地图上抹去
		 */ 
		public function clearMe():void
		{
			if(render!=null && inuse)
			{
				render.renderClear(this);
			}
		}
		
		/**
		 * 图形资源
		 */ 
		public function get graphics():GraphicsResource
		{
			return _graphics;
		}
		
		/**
		 * 图形资源
		 */ 
		public function set graphics(value:GraphicsResource):void
		{
			_graphics=value;
		}
		
		/**
		 * 方向值
		 */ 
		public function get directionNum():int
		{
			return _directionNum;
		}
		
		/**
		 * 方向值
		 */ 
		public function set directionNum(value:int):void
		{
			_directionNum=value;
		}
		
		/**
		 * 角色阵营
		 */ 
		public function get camp():uint
		{
			return _camp;
		}
		
		/**
		 * 角色阵营
		 */ 
		public function set camp(_c:uint):void
		{
			if(_c==0) return;
			_camp=_c;
		}
		
		/**
		 * 是否中央渲染
		 */ 
		public function get renderPos():uint
		{
			return _renderPos;
		}
		
		/**
		 * 渲染矩形
		 */
		public function get renderRect():Rectangle
		{
			return new Rectangle(0,0,graphics.frameWidth,graphics.frameHeight);
		}

		/**
		 * 清除
		 */ 
		public function clear():void
		{
			if(_graphics!=null)
			{
				_graphics.clear();
				_graphics=null;
			}
			
			Global.GC();
		}
	}
}